package com.Reactor3参考文档;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

// 我们首先得到 ID 的列表，然后通过它进一步获取到“对应的 name 和 statistics” 为元素的列表，整个过程用异步方式来实现。
public class Demo2 {

	@Test
	public void test(){
		Flux<String> ids = ifhrIds(); // 这一次，我们从一个异步方式提供的 ids 序列（Flux<String>）开始。

		Flux<String> combinations =
		                ids.flatMap(id -> { // 对于序列中的每一个元素，我们异步地处理它（flatMap 方法内）两次。
		                        Mono<String> nameTask = ifhrName(id); // 获取相应的 name。
		                        Mono<Integer> statTask = ifhrStat(id); // 获取相应的 statistic.

		                        return nameTask.zipWith(statTask,
		                                        (name, stat) -> "Name " + name + " has stats " + stat); // 异步地组合两个值。
		                });

		Mono<List<String>> result = combinations.collectList(); // 随着序列中的元素值“到位”，它们收集一个 List 中。

		List<String> results = result.block(); // 在生成流的环节，我们可以继续异步地操作 Flux 流，对其进行组合和订阅（subscribe）。 最终我们很可能得到一个 Mono 。由于是测试，我们阻塞住（block()），等待流处理过程结束， 然后直接返回集合。
		System.out.println(results);
	}

	private Mono<Integer> ifhrStat(String id) {
		return Mono.just(stats.get(id));
	}

	private Mono<String> ifhrName(String id) {
		return Mono.just(names.get(id));
	}

	private Flux<String> ifhrIds() {
		return Flux.just("1", "2", "3", "4", "5");
	}

	Map<String, String> names = new HashMap<String, String>(){{put("1", "NameJoe");put("2", "NameBart");put("3", "NameHenry");put("4", "NameNicole");put("5", "NameABSLAJNFOAJNFOANFANSF");}};
	Map<String, Integer> stats = new HashMap<String, Integer>(){{put("1", 103);put("2", 104);put("3", 105);put("4", 106);put("5", 121);}};

}
